python使用docxtpl生成word模板 您所在的位置:网站首页 python 模版文件 python使用docxtpl生成word模板

python使用docxtpl生成word模板

2023-12-08 20:46| 来源: 网络整理| 查看: 265

python-docxtpl包简单使用和实战,Python处理word,docx文件。

最近需要处理一些爬虫得到的数据来进行一些自动化报告的操作,因为需要生成的是word的报告,所以估选用docxtpl库来直接生成模板 docxtpl 模板标签主要来自jinja2,可以了解 jinja2语法,也有些额外的不一样,可以自行百度或者参考官方文档

开始

使用Pip安装docxtpl

pip install docxtpl 简单demo

根据官网的简单举例:

from docxtpl import DocxTemplate doc = DocxTemplate("my_word_template.docx") # 读取模板 context = { 'company_name' : "World company" } # 需要传入的字典, 需要在word对应的位置输入 {{ company_name }} doc.render(context) # 渲染到模板中 doc.save("generated_doc.docx") # 生成一个新的模板

至此,就可以直接拿来实战了, 实战中包含了图片的替换和表格文本的一些插入。都是很简单的,就是将组成的字典渲染到word中去就可以

实战 #!/usr/bin/env python # -*- encoding: utf-8 -*- ''' @File : generate_word.py @Time : 2021/05/28 15:52:57 @Author : OD @Version : 1.0 ''' # here put the import lib from docx import Document from docx.shared import Pt import datetime from docxtpl import DocxTemplate, RichText, InlineImage from docx.shared import Mm import json # 根据模板生成一个周报内容 class Generate2Word: def __init__(self): self.now = str(datetime.date.today() - datetime.timedelta(days=0)).replace("-", "").replace(" ", "") self.last = str(datetime.date.today() - datetime.timedelta(days=7)).replace("-", "").replace(" ", "") self.now = self.now[4:6] + '.' + self.now[6:] # 现在时间 self.last = self.last[4:6] + '.' + self.last[6:] # 7天前时间 def generate_report(self, tpl_file, report_file): tpl= DocxTemplate(tpl_file) # 第一个图表 context = { 'start_time' : self.last, 'end_time' : self.now, 'total_attention': 123, 'add_attention': 20, 'dau': 100, 'dau_per':20 / 100, 'theme_tiezi':1234, 'all_tiezi': 12345, 'add_theme_tiezi': 25, 'add_tiezi': 20, 'official_pub':12, 'del_tiezi': 5, } image1_path = r'1.png' # 要生成的图片地址 image2_path = r'2.png' # 要生成的图片地址 insert_image1 = InlineImage(tpl, image1_path, width=Mm(140)) insert_image2 = InlineImage(tpl, image2_path, width=Mm(140)) # 作为图片的替换 img_context = { 'img1': insert_image1, 'img2': insert_image2 } # 管理帖子,需要渲染 bawu_lists = { "bawu_table": [{ 'publish_time': '2021/5/7', 'title': '测试1', 'link': 'https://www.baidu,com, 'reply_num': 27 }, { 'publish_time': '2021/5/8', 'title': '测试2', 'link': 'https://www.baidu,com', 'reply_num': 4 }, { 'publish_time': '2021/5/31', 'title': '湖人浓眉伤退', 'link': 'https://www.baidu,com', 'reply_num': 40 }, { 'publish_time': '2021/6/2', 'title': '勒布朗詹姆斯率队拿下g5', 'link': 'https://www.baidu,com', 'reply_num': 444 } ], "navy_table": [{ 'publish_time': '2021/4/23', 'title': '测试3', 'link': 'https://www.baidu,com', 'reply_num': 444 }, { 'publish_time': '2021/4/30', 'title': '测试4', 'link': 'https://www.baidu,com', 'reply_num': 444 }, { 'publish_time': '2021/5/30', 'title': '测试5', 'link': 'https://www.baidu,com', 'reply_num': 444 } ] } bawu_summary = dict() bawu_sum_reply = 0 # 总有多少个回复 for bawu_data in bawu_lists.get('bawu_table'): bawu_summary['bawu_publish_num'] = len(bawu_lists.get('bawu_table', 0)) bawu_sum_reply += int(bawu_data.get('reply_num', 0)) bawu_summary['bawu_sum_reply'] = bawu_sum_reply navy_summary = dict() navy_sum_reply = 0 for navy_data in bawu_lists.get('navy_table'): navy_summary['navy_publish_num'] = len(bawu_lists.get('navy_table', 0)) navy_sum_reply += int(navy_data.get('reply_num', 0)) navy_summary['navy_sum_reply'] = navy_sum_reply tpl.render({**context, **img_context, ** bawu_lists, **bawu_summary, **navy_summary}) # 多个字典解构 print('生成模板成功...') tpl.save(report_file) def main(self): tpl_file = "文件模板.docx" # 指定的模板 report_file = f"新得{self.last}-{self.now}报告.docx" # 指定生成的报告位置 self.generate_report(tpl_file, report_file) if __name__ == '__main__': demo = Generate2Word() demo.main()

这样 就可以生成一个保留 word 格式的一个报告。工作也完成了

参考: 1、https://www.jianshu.com/p/758679db62ce 2、https://www.jianshu.com/p/465516750da6



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有